package com.tangruojie.app;

import com.tangruojie.manager.PluginManager;
import com.tangruojie.spi.Plugin;

import java.util.List;
import java.util.ServiceLoader;

/**
 * 应用主模块
 */
public class SpiApp {

    /**
     * 对比点	            方式一（直接使用 ServiceLoader）	方式二（封装在 PluginManager）
     * 使用方式	            原始的标准 SPI 方式	            自己封装的通用加载工具类
     * 灵活性	            较低，直接遍历	                    更高，可以添加缓存、过滤、筛选等逻辑
     * 是否易扩展	            ❌ 不方便统一管理	                ✅ 可以加插件描述、筛选标签等机制
     * 是否支持按类型获取	    ❌ 不支持，需手动判断	            ✅ 可封装方法支持按名字/类型获取
     * 推荐度	            入门阶段推荐	                    项目化开发推荐封装成管理器
     * ---------
     * 本质上是一样的，只不过包装了一下 ServiceLoader，转换成了 List<Plugin>。
     * 但是！你可以在 PluginManager 里做更多事情，例如：
     * 加缓存（防止多次扫描 SPI 文件）
     * 按插件名称查找
     * 动态注册插件
     * 日志输出
     * ---------
     * 如何调用某一个指定的实现类？
     * SPI 默认会把所有实现类都加载并遍历，没有“默认”或“指定”的机制，所以你需要自己判断。
     */

    public static void main(String[] args) {
        ServiceLoader<Plugin> load = ServiceLoader.load(Plugin.class);
        for (Plugin plugin : load) {
            plugin.execute();
        }

        /*List<Plugin> plugins = PluginManager.loadPlugins();
        for (Plugin plugin : plugins) {
            plugin.execute();
        }*/

        Plugin logging = PluginManager.getPlugin("logging");
        logging.execute();

        Plugin security = PluginManager.getPlugin("security");
        security.execute();
    }
}
